﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpPickInterface.h"
#include "IObject.h"
#include "ContainerUtil.h"

namespace gcmp {
    class IDocument;
    class IGraphicsNodeReference;
    class IPreHighlightsChangeEvent;
    /// \brief 预选高亮集，为单例对象，全局唯一
    ///
    /// 当前被预选高亮的对象均存于此高亮集中
    /// 和IHighlights类似，用于高亮一组GraphicsNodeReference。
    /// 区别在于：
    /// 高亮的样式不一样。称为预选高亮。顾名思义对象即将被选中前的高亮样式。
    /// 拾取、捕捉也用它来高亮捕捉到的对象。
    /// 整个应用程序只有唯一个预选高亮集，由渲染框架负责高亮此集合
    class GCMP_PICK_INTERFACE_EXPORT IPreHighlights : public IObject
    {
        DEFINE_CAST_DERIVED(gcmp::IPreHighlights, gcmp::IObject);
    public:

        /// \brief 获得预选高亮集
        /// \return 预选高亮集指针
        static IPreHighlights* Get();

        /// \brief 初始化预选高亮集
        ///
        /// 调用时机：切换文档时或者切换视图时
        /// 所做操作：重置文档+清空高亮集内容
        /// \param pDocument 当前文档信息
        /// \return void
        virtual void Init(const IDocument* pDocument) = 0;

        /// \brief 清除预选高亮集中内容
        /// \return void
        virtual void Clear() = 0;

        /// \brief 判断预选高亮集是否为空
        /// \return 返回true表示为空，false表示不为空
        virtual bool IsEmpty() const = 0;

        /// \brief 获得预选高亮集大小
        /// \return 预选高亮集大小
        virtual Int64 GetCount() const = 0;

        /// \brief 获得预选高亮集中所有数据
        /// \return 返回预选高亮集中图形节点引用集合
        virtual const std::vector<OwnerPtr<IGraphicsNodeReference>>& GetAllGraphicsNodeReferences() const = 0;

        /// \brief 向预选高亮集中添加图形节点引用集合
        /// \param graphicsNodeReferences 被添加的图形节点引用集合
        /// \return void
        virtual void AddGraphicsNodeReferences(const std::vector<OwnerPtr<IGraphicsNodeReference>>& graphicsNodeReferences) = 0;

        /// \brief 设置预选高亮集中的图形节点引用集合
        ///
        /// 设置新数据之前会清除旧数据
        /// \param graphicsNodeReferences 新设置的图形节点引用集合
        /// \return void
        virtual void SetGraphicsNodeReferences(const std::vector<OwnerPtr<IGraphicsNodeReference>>& graphicsNodeReferences) = 0;

        /// \brief 获得预选高亮集发生改变通知事件
        /// \return 预选高亮集发生改变通知事件
        virtual IPreHighlightsChangeEvent* GetPreHighlightsChangeEvent() const = 0;
    };

}// namespace gcmp

